package com.nageoffer.shortlink.project.mq.producer;

import com.alibaba.fastjson2.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.UUID;

/**
 * 短链接监控状态保存消息队列生产者
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ShortLinkStatsSaveProducer {

    private final RocketMQTemplate rocketMQTemplate;

    @Value("${rocketmq.producer.topic}")
    private String statsSaveTopic;

    /**
     * 发送消息队列消费短链接统计
     */
    public void send(Map<String, String> producerMap) {
        // 生成一个唯一的 keys 作为消息的标识符
        String keys = UUID.randomUUID().toString();

        // 将生成的 keys 添加到消息体中
        producerMap.put("keys", keys);

        // 构建消息对象
        Message<Map<String, String>> build = MessageBuilder
                .withPayload(producerMap) // 设置消息体内容
                .setHeader(MessageConst.PROPERTY_KEYS, keys) // 设置消息头中的 keys 属性
                .build();

        // 用于存储消息发送的结果
        SendResult sendResult;

        try {
            // 调用 RocketMQ 模板的同步发送方法发送消息
            // 参数分别为：目标主题、消息对象、发送超时时间（毫秒）
            sendResult = rocketMQTemplate.syncSend(statsSaveTopic, build, 2000L);

            // 记录消息发送成功的日志
            // 包括发送状态、消息 ID 和消息 keys
            log.info("[消息访问统计监控] 消息发送结果：{}，消息ID：{}，消息Keys：{}",
                    sendResult.getSendStatus(), sendResult.getMsgId(), keys);
        } catch (Throwable ex) {
            // 如果消息发送失败，记录错误日志
            // 包括消息体内容和异常信息
            log.error("[消息访问统计监控] 消息发送失败，消息体：{}", JSON.toJSONString(producerMap), ex);

            // 在这里可以添加自定义的失败处理逻辑
            // 例如：重试机制、补偿措施等
            // 自定义行为...
        }
    }
}
